home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch18 / Persp.frm (.txt) < prev    next >
Visual Basic Form  |  1999-07-10  |  14KB  |  473 lines

  1. VERSION 5.00
  2. Begin VB.Form frmPersp 
  3.    Appearance      =   0  'Flat
  4.    BackColor       =   &H00C0C0C0&
  5.    Caption         =   "Persp"
  6.    ClientHeight    =   5310
  7.    ClientLeft      =   1410
  8.    ClientTop       =   570
  9.    ClientWidth     =   6870
  10.    BeginProperty Font 
  11.       Name            =   "MS Sans Serif"
  12.       Size            =   8.25
  13.       Charset         =   0
  14.       Weight          =   700
  15.       Underline       =   0   'False
  16.       Italic          =   0   'False
  17.       Strikethrough   =   0   'False
  18.    EndProperty
  19.    ForeColor       =   &H80000008&
  20.    KeyPreview      =   -1  'True
  21.    LinkTopic       =   "Form1"
  22.    PaletteMode     =   1  'UseZOrder
  23.    ScaleHeight     =   5310
  24.    ScaleWidth      =   6870
  25.    Begin VB.Frame Frame1 
  26.       Caption         =   "Pre-Rotations"
  27.       Height          =   2415
  28.       Index           =   2
  29.       Left            =   5400
  30.       TabIndex        =   9
  31.       Top             =   0
  32.       Width           =   1455
  33.       Begin VB.TextBox txtZW 
  34.          Height          =   285
  35.          Left            =   600
  36.          MaxLength       =   6
  37.          TabIndex        =   15
  38.          Text            =   "0.0"
  39.          Top             =   960
  40.          Width           =   735
  41.       End
  42.       Begin VB.TextBox txtYW 
  43.          Height          =   285
  44.          Left            =   600
  45.          MaxLength       =   6
  46.          TabIndex        =   14
  47.          Text            =   "0.0"
  48.          Top             =   600
  49.          Width           =   735
  50.       End
  51.       Begin VB.TextBox txtXW 
  52.          Height          =   285
  53.          Left            =   600
  54.          MaxLength       =   6
  55.          TabIndex        =   13
  56.          Text            =   "0.0"
  57.          Top             =   240
  58.          Width           =   735
  59.       End
  60.       Begin VB.TextBox txtYZ 
  61.          Height          =   285
  62.          Left            =   600
  63.          MaxLength       =   6
  64.          TabIndex        =   12
  65.          Text            =   "0.0"
  66.          Top             =   2040
  67.          Width           =   735
  68.       End
  69.       Begin VB.TextBox txtXZ 
  70.          Height          =   285
  71.          Left            =   600
  72.          MaxLength       =   6
  73.          TabIndex        =   11
  74.          Text            =   "0.0"
  75.          Top             =   1680
  76.          Width           =   735
  77.       End
  78.       Begin VB.TextBox txtXY 
  79.          Height          =   285
  80.          Left            =   600
  81.          MaxLength       =   6
  82.          TabIndex        =   10
  83.          Text            =   "0.0"
  84.          Top             =   1320
  85.          Width           =   735
  86.       End
  87.       Begin VB.Label Label1 
  88.          Caption         =   "ZW"
  89.          Height          =   255
  90.          Index           =   14
  91.          Left            =   240
  92.          TabIndex        =   21
  93.          Top             =   960
  94.          Width           =   375
  95.       End
  96.       Begin VB.Label Label1 
  97.          Caption         =   "YW"
  98.          Height          =   255
  99.          Index           =   13
  100.          Left            =   240
  101.          TabIndex        =   20
  102.          Top             =   600
  103.          Width           =   375
  104.       End
  105.       Begin VB.Label Label1 
  106.          Caption         =   "XW"
  107.          Height          =   255
  108.          Index           =   12
  109.          Left            =   240
  110.          TabIndex        =   19
  111.          Top             =   240
  112.          Width           =   375
  113.       End
  114.       Begin VB.Label Label1 
  115.          Caption         =   "YZ"
  116.          Height          =   255
  117.          Index           =   8
  118.          Left            =   240
  119.          TabIndex        =   18
  120.          Top             =   2040
  121.          Width           =   375
  122.       End
  123.       Begin VB.Label Label1 
  124.          Caption         =   "XZ"
  125.          Height          =   255
  126.          Index           =   7
  127.          Left            =   240
  128.          TabIndex        =   17
  129.          Top             =   1680
  130.          Width           =   375
  131.       End
  132.       Begin VB.Label Label1 
  133.          Caption         =   "XY"
  134.          Height          =   255
  135.          Index           =   6
  136.          Left            =   240
  137.          TabIndex        =   16
  138.          Top             =   1320
  139.          Width           =   375
  140.       End
  141.    End
  142.    Begin VB.Frame Frame1 
  143.       Caption         =   "Post-Rotations"
  144.       Height          =   1335
  145.       Index           =   1
  146.       Left            =   5400
  147.       TabIndex        =   2
  148.       Top             =   3120
  149.       Width           =   1455
  150.       Begin VB.TextBox txtXW2 
  151.          Height          =   285
  152.          Left            =   600
  153.          MaxLength       =   6
  154.          TabIndex        =   5
  155.          Text            =   "0.2"
  156.          Top             =   240
  157.          Width           =   735
  158.       End
  159.       Begin VB.TextBox txtYW2 
  160.          Height          =   285
  161.          Left            =   600
  162.          MaxLength       =   6
  163.          TabIndex        =   4
  164.          Text            =   "0.1"
  165.          Top             =   600
  166.          Width           =   735
  167.       End
  168.       Begin VB.TextBox txtZW2 
  169.          Height          =   285
  170.          Left            =   600
  171.          MaxLength       =   6
  172.          TabIndex        =   3
  173.          Text            =   "0.0"
  174.          Top             =   960
  175.          Width           =   735
  176.       End
  177.       Begin VB.Label Label1 
  178.          Caption         =   "X"
  179.          Height          =   255
  180.          Index           =   9
  181.          Left            =   240
  182.          TabIndex        =   8
  183.          Top             =   240
  184.          Width           =   255
  185.       End
  186.       Begin VB.Label Label1 
  187.          Caption         =   "Y"
  188.          Height          =   255
  189.          Index           =   10
  190.          Left            =   240
  191.          TabIndex        =   7
  192.          Top             =   600
  193.          Width           =   255
  194.       End
  195.       Begin VB.Label Label1 
  196.          Caption         =   "Z"
  197.          Height          =   255
  198.          Index           =   11
  199.          Left            =   240
  200.          TabIndex        =   6
  201.          Top             =   960
  202.          Width           =   255
  203.       End
  204.    End
  205.    Begin VB.TextBox txtD 
  206.       Height          =   285
  207.       Left            =   6000
  208.       TabIndex        =   1
  209.       Text            =   "3"
  210.       Top             =   2640
  211.       Width           =   735
  212.    End
  213.    Begin VB.PictureBox picCanvas 
  214.       AutoRedraw      =   -1  'True
  215.       Height          =   5295
  216.       Left            =   0
  217.       ScaleHeight     =   349
  218.       ScaleMode       =   3  'Pixel
  219.       ScaleWidth      =   349
  220.       TabIndex        =   0
  221.       Top             =   0
  222.       Width           =   5295
  223.    End
  224.    Begin VB.Label Label1 
  225.       Caption         =   "D"
  226.       Height          =   255
  227.       Index           =   15
  228.       Left            =   5640
  229.       TabIndex        =   22
  230.       Top             =   2640
  231.       Width           =   255
  232.    End
  233. Attribute VB_Name = "frmPersp"
  234. Attribute VB_GlobalNameSpace = False
  235. Attribute VB_Creatable = False
  236. Attribute VB_PredeclaredId = True
  237. Attribute VB_Exposed = False
  238. Option Explicit
  239. ' Location of focus point.
  240. Private Const FocusX = 0#
  241. Private Const FocusY = 0#
  242. Private Const FocusZ = 0#
  243. ' The points.
  244. Private NumPoints As Integer
  245. Private Points() As Point4D
  246. ' The segments.
  247. Private NumSegments As Integer
  248. Private Segments() As Segment4D
  249. ' Add a segment to the lists.
  250. Private Sub AddSegment( _
  251.     ByVal x1 As Single, ByVal y1 As Single, ByVal z1 As Single, ByVal w1 As Single, _
  252.     ByVal x2 As Single, ByVal y2 As Single, ByVal z2 As Single, ByVal w2 As Single _
  253. Dim pt1 As Integer
  254. Dim pt2 As Integer
  255.     ' Find the points.
  256.     pt1 = PointNumber(x1, y1, z1, w1)
  257.     pt2 = PointNumber(x2, y2, z2, w2)
  258.     ' Create the segment entry.
  259.     NumSegments = NumSegments + 1
  260.     ReDim Preserve Segments(1 To NumSegments)
  261.     With Segments(NumSegments)
  262.         .pt1 = pt1
  263.         .pt2 = pt2
  264.     End With
  265. End Sub
  266. ' Apply this matrix to the points.
  267. Private Sub Apply(M() As Single)
  268. Dim pt As Integer
  269.     For pt = 1 To NumPoints
  270.         m4Apply Points(pt).coord, M, Points(pt).trans
  271.     Next pt
  272. End Sub
  273. ' Apply this matrix to the points.
  274. Private Sub ApplyFull(M() As Single)
  275. Dim pt As Integer
  276.     For pt = 1 To NumPoints
  277.         m4ApplyFull Points(pt).coord, M, Points(pt).trans
  278.     Next pt
  279. End Sub
  280. ' Draw the segments.
  281. Private Sub Draw(ByVal pic As PictureBox)
  282. Dim seg As Integer
  283.     For seg = 1 To NumSegments
  284.         pic.Line ( _
  285.             Points(Segments(seg).pt1).trans(1), _
  286.             Points(Segments(seg).pt1).trans(2))-( _
  287.             Points(Segments(seg).pt2).trans(1), _
  288.             Points(Segments(seg).pt2).trans(2))
  289.     Next seg
  290. End Sub
  291. ' Find this point's index. If it is not here,
  292. ' create it.
  293. Private Function PointNumber(ByVal X As Single, ByVal Y As Single, ByVal Z As Single, ByVal W As Single)
  294. Dim i As Integer
  295.     ' Find the point.
  296.     For i = 1 To NumPoints
  297.         With Points(i)
  298.             If .coord(1) = X And _
  299.                .coord(2) = Y And _
  300.                .coord(3) = Z And _
  301.                .coord(4) = W _
  302.             Then
  303.                 PointNumber = i
  304.                 Exit Function
  305.             End If
  306.         End With
  307.     Next i
  308.     ' We did not find the point. Create it.
  309.     NumPoints = NumPoints + 1
  310.     ReDim Preserve Points(1 To NumPoints)
  311.     With Points(NumPoints)
  312.         .coord(1) = X
  313.         .coord(2) = Y
  314.         .coord(3) = Z
  315.         .coord(4) = W
  316.         .coord(5) = 1#
  317.     End With
  318.     PointNumber = NumPoints
  319. End Function
  320. ' Draw the hypercube.
  321. Private Sub DrawData(ByVal pic As PictureBox)
  322. Dim xw_rot As Single
  323. Dim yw_rot As Single
  324. Dim zw_rot As Single
  325. Dim xy_rot As Single
  326. Dim xz_rot As Single
  327. Dim yz_rot As Single
  328. Dim xw2_rot As Single
  329. Dim yw2_rot As Single
  330. Dim zw2_rot As Single
  331. Dim XW(1 To 5, 1 To 5) As Single
  332. Dim YW(1 To 5, 1 To 5) As Single
  333. Dim ZW(1 To 5, 1 To 5) As Single
  334. Dim XY(1 To 5, 1 To 5) As Single
  335. Dim XZ(1 To 5, 1 To 5) As Single
  336. Dim YZ(1 To 5, 1 To 5) As Single
  337. Dim XW2(1 To 5, 1 To 5) As Single
  338. Dim YW2(1 To 5, 1 To 5) As Single
  339. Dim ZW2(1 To 5, 1 To 5) As Single
  340. Dim S(1 To 5, 1 To 5) As Single
  341. Dim T(1 To 5, 1 To 5) As Single
  342. Dim P(1 To 5, 1 To 5) As Single
  343. Dim M12(1 To 5, 1 To 5) As Single
  344. Dim M34(1 To 5, 1 To 5) As Single
  345. Dim M1_4(1 To 5, 1 To 5) As Single
  346. Dim M56(1 To 5, 1 To 5) As Single
  347. Dim M78(1 To 5, 1 To 5) As Single
  348. Dim M5_8(1 To 5, 1 To 5) As Single
  349. Dim M1_8(1 To 5, 1 To 5) As Single
  350. Dim M910(1 To 5, 1 To 5) As Single
  351. Dim M1112(1 To 5, 1 To 5) As Single
  352. Dim M9_12(1 To 5, 1 To 5) As Single
  353. Dim M_All(1 To 5, 1 To 5) As Single
  354. Dim D As Single
  355.     If Not IsNumeric(txtXW.Text) Then Exit Sub
  356.     If Not IsNumeric(txtYW.Text) Then Exit Sub
  357.     If Not IsNumeric(txtZW.Text) Then Exit Sub
  358.     If Not IsNumeric(txtXY.Text) Then Exit Sub
  359.     If Not IsNumeric(txtXZ.Text) Then Exit Sub
  360.     If Not IsNumeric(txtYZ.Text) Then Exit Sub
  361.     If Not IsNumeric(txtXW2.Text) Then Exit Sub
  362.     If Not IsNumeric(txtYW2.Text) Then Exit Sub
  363.     If Not IsNumeric(txtZW2.Text) Then Exit Sub
  364.     If Not IsNumeric(txtD.Text) Then Exit Sub
  365.     xw_rot = CSng(txtXW.Text)
  366.     yw_rot = CSng(txtYW.Text)
  367.     zw_rot = CSng(txtZW.Text)
  368.     xy_rot = CSng(txtXY.Text)
  369.     xz_rot = CSng(txtXZ.Text)
  370.     yz_rot = CSng(txtYZ.Text)
  371.     xw2_rot = CSng(txtXW2.Text)
  372.     yw2_rot = CSng(txtYW2.Text)
  373.     zw2_rot = CSng(txtZW2.Text)
  374.     D = CSng(txtD.Text)
  375.     Screen.MousePointer = vbHourglass
  376.     DoEvents
  377.     ' Prevent overflow errors when drawing lines
  378.     ' too far out of bounds.
  379.     On Error Resume Next
  380.     ' Calculate the rotation matrices.
  381.     m4XWRotate XW, xw_rot
  382.     m4YWRotate YW, yw_rot
  383.     m4ZWRotate ZW, zw_rot
  384.     m4XYRotate XY, xy_rot
  385.     m4XZRotate XZ, xz_rot
  386.     m4YZRotate YZ, yz_rot
  387.     m4XWRotate XW2, xw2_rot
  388.     m4YWRotate YW2, yw2_rot
  389.     m4ZWRotate ZW2, zw2_rot
  390.     ' Calculate the projection matrix.
  391.     m4PerspectiveW P, D
  392.     ' Scale and translate so it looks OK in pixels.
  393.     m4Scale S, 75, -75, 1, 1
  394.     m4Translate T, pic.ScaleWidth / 2, pic.ScaleHeight / 2, 0, 0
  395.     m4MatMultiply M12, XW, YW
  396.     m4MatMultiply M34, ZW, XY
  397.     m4MatMultiply M56, XZ, YZ
  398.     m4MatMultiplyFull M78, P, XW2
  399.     m4MatMultiply M1_4, M12, M34
  400.     m4MatMultiplyFull M5_8, M56, M78
  401.     m4MatMultiplyFull M1_8, M1_4, M5_8
  402.     m4MatMultiply M910, YW2, ZW2
  403.     m4MatMultiply M1112, S, T
  404.     m4MatMultiply M9_12, M910, M1112
  405.     m4MatMultiplyFull M_All, M1_8, M9_12
  406.     ' Transform the points.
  407.     ApplyFull M_All
  408.     ' Display the data.
  409.     pic.Cls
  410.     Draw pic
  411.     pic.Refresh
  412.     Screen.MousePointer = vbDefault
  413. End Sub
  414. Private Sub Form_Load()
  415.     ' Create the data.
  416.     CreateData
  417.     ' Project and draw the data.
  418.     Show
  419.     DrawData picCanvas
  420. End Sub
  421. ' Create the hypercube.
  422. Private Sub CreateData()
  423. Dim X As Integer
  424. Dim Y As Integer
  425. Dim Z As Integer
  426. Dim W As Integer
  427.     MousePointer = vbHourglass
  428.     Refresh
  429.     For X = -1 To 1 Step 2
  430.         For Y = -1 To 1 Step 2
  431.             For Z = -1 To 1 Step 2
  432.                 For W = -1 To 1 Step 2
  433.                     If X = -1 Then _
  434.                         AddSegment _
  435.                             X, Y, Z, W, _
  436.                             1, Y, Z, W
  437.                     If Y = -1 Then _
  438.                         AddSegment _
  439.                             X, Y, Z, W, _
  440.                             X, 1, Z, W
  441.                     If Z = -1 Then _
  442.                         AddSegment _
  443.                             X, Y, Z, W, _
  444.                             X, Y, 1, W
  445.                     If W = -1 Then _
  446.                         AddSegment _
  447.                             X, Y, Z, W, _
  448.                             X, Y, Z, 1
  449.                 Next W
  450.             Next Z
  451.         Next Y
  452.     Next X
  453.     MousePointer = vbDefault
  454. End Sub
  455. Private Sub txtXY_Change()
  456.     DrawData picCanvas
  457. End Sub
  458. Private Sub txtXZ_Change()
  459.     DrawData picCanvas
  460. End Sub
  461. Private Sub txtYW_Change()
  462.     DrawData picCanvas
  463. End Sub
  464. Private Sub txtYZ_Change()
  465.     DrawData picCanvas
  466. End Sub
  467. Private Sub txtZW_Change()
  468.     DrawData picCanvas
  469. End Sub
  470. Private Sub txtXW_Change()
  471.     DrawData picCanvas
  472. End Sub
  473.